package com.withyou.design_pattern.proxyPatteren;
/**
 * 静态代理模式
 * @author guicheng.huang
 *
 * 1.可以做到在不修改目标对象的功能前提下,对目标功能扩展.
   2.缺点:  
               因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多.同时,
               一旦接口增加方法,目标对象与代理对象都要维护.
              如何解决静态代理中的缺点呢?答案是可以使用动态代理方式
 */
public class StaticProxyPatteren {

	interface TargetInterface{
		
		public void say();
		
	}
	
	static class Target implements TargetInterface{
		
		private String name;
		
		private Integer age;

		public Target(){}
		
		public Target(String name, Integer age) {
			super();
			this.name = name;
			this.age = age;
		}

		/** 谁出自己的名字和年龄 */
		public void say(){
			System.out.println("My name is "+name+", Age is"+age);
		}
		
		public String getName() {
			return name;
		}

		public void setName(String name) {
			this.name = name;
		}

		public Integer getAge() {
			return age;
		}

		public void setAge(Integer age) {
			this.age = age;
		}
	}
	
	static class TargetProxy implements TargetInterface{

		private Target target;
		
		public TargetProxy(Target target){
			this.target = target;
		}
		
		public void say() {
			System.out.println("开始老师先说开场白");
			target.say();
			System.out.println("结束老师总结");
		}
	}
	
	/**
	* @Description 方法描述: 测试 <pre>
	* @return  返回值类型: <pre>  
	* @author 作者: guicheng.huang <pre>
	* @date 时间: 2019年5月28日 下午5:44:45 <pre> 
	* @throws 异常: <pre>
	 */
	public static void main(String[] args) {
		Target tg = new Target("test",21);
		TargetProxy proxy = new TargetProxy(tg);
		proxy.say();
	}
}
